﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Sireass.Bl;
using Csla;
using Telerik.Web.UI;

namespace Sireass.Asp.Administracion
{
    public partial class SeguridadUsuariosInternos : System.Web.UI.Page
    {

        #region Page

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                //Cargando el listado de prestadores
                CargaListadoUsuarios();
                //Cargando los combos
                //Titulo
                radCmbTitulo.DataSource = NombreValorTinyList.GetNombreValorTinyList(new SingleCriteria<string>("Cat_Titulo"));
                radCmbTitulo.DataBind();
                //Unidad Responsable
                radCmbUnidadResponsable.DataSource = NombreValorList.GetNombreValorList(new SingleCriteria<string>("Cat_UnidadResponsable"));
                radCmbUnidadResponsable.DataBind();
                //Sexo 
                radCmbSexo.DataSource = NombreValorTinyList.GetNombreValorTinyList(new SingleCriteria<string>("Cat_Sexo"));
                radCmbSexo.DataBind();
            }
            else
            {
                lblError.Text = string.Empty;
                lblExito.Text = string.Empty;
            }
        }

        #endregion

        #region Botones
            protected void radBtnBuscar_Click(object sender, EventArgs e)
            {
                divDatosUsuario.Visible = true;
                lblRegistroEdicion.Text = "Registro";
                radBtnBuscar.Visible = false;
                radbtnCancelar.Visible = false;
                radTxtCurp.Enabled = false;
                radBtnGuardar.Visible = true;
                radBtnRegresar.Visible = true;

            }

            protected void radbtnCancelar_Click(object sender, EventArgs e)
            {
                LimpiaControlesBusqueda();
                mvwAdministracionUsuarios.ActiveViewIndex = 0;
            }

            protected void radBtnRegresar_Click(object sender, EventArgs e)
            {
                mvwAdministracionUsuarios.ActiveViewIndex = 0;
                ControlesIniciales();
            }

            protected void radBtnGuardar_Click(object sender, EventArgs e)
            {
                if (radBtnGuardar.Text == "Guardar")
                {

                    if (InsertarUsuario() == true)
                    {
                        lblExito.Text = "Operación realizada con éxito";
                    }
                    else return;
                }
                else //actualizar 
                {
                    long intIdPrestador = (long)ViewState["vwsIdUsuario"];
                    if (ActualizarUsuario(intIdPrestador) == true)
                    {
                        lblExito.Text = "Operación realizada con éxito";

                    }
                    else return;
                }

                mvwAdministracionUsuarios.ActiveViewIndex = 0;
                CargaListadoUsuarios();
                lblExito.Text = "Operación realizada con éxito";
                ControlesIniciales();
            }
        
            protected void btnCambiarPassword_Click(object sender, EventArgs e)
            {
                Button btn = sender as Button;
                if (btn.CommandName == "CambiarPswd")
                {
                    btn.CommandName = "CancelarCambiarPswd";
                    btn.Text = "Cancelar";
                    rfvPassword.Enabled = true;
                    rfvConfPassword.Enabled = true;
                    lblPassword.Visible = true;
                    lblConfPassword.Visible = true;
                    radTxtPassword.Visible = true;
                    radTxtConfPassword.Visible = true;
                }
                else
                {
                    btn.CommandName = "CambiarPswd";
                    btn.Text = "Cambiar contraseña";
                    rfvPassword.Enabled = false;
                    rfvConfPassword.Enabled = false;
                    lblPassword.Visible = false;
                    lblConfPassword.Visible = false;
                    radTxtPassword.Visible = false;
                    radTxtConfPassword.Visible = false;
                }
            }
        
        #endregion

        #region Grid
            protected void radGrdListado_PageIndexChanged(object sender, Telerik.Web.UI.GridPageChangedEventArgs e)
            {
                CargaListadoUsuarios();
            }

            protected void radGrdListado_PageSizeChanged(object sender, Telerik.Web.UI.GridPageSizeChangedEventArgs e)
            {
                CargaListadoUsuarios();
            }

            protected void radGrdListado_ItemCommand(object sender, Telerik.Web.UI.GridCommandEventArgs e)
            {
                try
                {
                    long intIdUsuario;
                    switch (e.CommandName)
                    {
                        case "Editar":
                            intIdUsuario = (long)radGrdListado.MasterTableView.Items[e.Item.ItemIndex].GetDataKeyValue("IdUsuario");
                            ViewState["vwsIdUsuario"] = intIdUsuario;
                            if (CargaDatosUsuario(intIdUsuario) == true)
                            {
                                lblRegistroEdicion.Text = "EDICIÓN";
                                mvwAdministracionUsuarios.ActiveViewIndex = 1;
                                radBtnGuardar.Text = "Actualizar";
                                radBtnGuardar.Visible = true;
                                radBtnRegresar.Visible = true;
                                ControlesEdicion(true);

                            }
                            else return;
                            break;
                        case "Nuevo":
                            ControlesEdicion(false);
                            mvwAdministracionUsuarios.ActiveViewIndex = 1;
                            break;

                        case "Eliminar":
                            intIdUsuario = (long)radGrdListado.MasterTableView.Items[e.Item.ItemIndex].GetDataKeyValue("IdUsuario");
                            if (EliminarUsuario(intIdUsuario) == true)
                            {
                                lblExito.Text = "Operación realizada con éxito";
                                CargaListadoUsuarios();

                            }

                            break;

                        default: break;

                    }

                }


                catch (Exception ex)
                {
                    lblError.Text = ex.Message;
                }
            }

            protected void radGrdListado_PreRender(object sender, EventArgs e)
            {
                try
                {
                    CheckBox chk;
                    string strHabilitado;

                    foreach (GridDataItem celda in radGrdListado.Items)
                    {
                        chk = (CheckBox)celda["Activado"].FindControl("chkHabilitado");
                        strHabilitado = celda["Habilitado"].Text;

                        if (strHabilitado == "True")
                            chk.Checked = true;

                        else
                            chk.Checked = false;
                    }


                }
                catch (Exception ex)
                {
                    lblError.Text = ex.Message;
                }
            }
        #endregion
        #region Métodos
            /// <summary>
            /// Establece el estado inicial de los controles del formulario
            /// </summary>
            private void ControlesIniciales()
            {
                LimpiaControlesBusqueda();
                //Formulario
                radTxtNombre.Text = string.Empty;
                radTxtAPaterno.Text = string.Empty;
                radTxtAMaterno.Text = string.Empty;
                radMskTelefono.Text = string.Empty;
                radMskTelCelular.Text = string.Empty;
                radTxtEmail.Text = string.Empty;
                radBtnRegresar.Visible = false;
                radBtnGuardar.Visible = false;
                radBtnGuardar.Text = "Guardar";
                divDatosUsuario.Visible = false;
                radCmbTitulo.ClearSelection();
                radCmbTitulo.Text = string.Empty;
                radCmbUnidadResponsable.ClearSelection();
                radCmbUnidadResponsable.Text = string.Empty;
                radCmbSexo.ClearSelection();
                radCmbSexo.Text = string.Empty;
                radTxtUsuario.Text = string.Empty;
                rfvPassword.Enabled = true;
                rfvConfPassword.Enabled = true;
                btnCambiarPassword.Visible = false;
                btnCambiarPassword.CommandName = "CambiarPswd";
                btnCambiarPassword.Text = "Cambiar contraseña";
            }

            /// <summary>
            /// Limpia los controles de la sección de búsqueda
            /// </summary>
            private void LimpiaControlesBusqueda()
            {
                //Búsqueda
                lblRegistroEdicion.Text = "Búsqueda";
                radBtnBuscar.Visible = true;
                radTxtCurp.Enabled = true;
                radbtnCancelar.Visible = true;
                radTxtCurp.Text = string.Empty;
            }

            /// <summary>
            /// Llena el grid con el listado de los usuarios internos
            /// </summary>
            /// <returns></returns>
            protected Boolean CargaListadoUsuarios()
            {
                try
                {
                    radGrdListado.DataSource = AdministrativoList.GetAdministrativoList();
                    radGrdListado.DataBind();
                    return true;

                }

                catch (Exception ex)
                {
                    lblError.Text = ex.Message;
                    return false;

                }
            }

            /// <summary>
            /// Carga los datos del usuario
            /// </summary>
            /// <param name="intIdUsuario">IdUsuario</param>
            /// <returns></returns>
            protected Boolean CargaDatosUsuario(long intIdUsuario)
            {
                try
                {
                    //Usuario
                    UsuarioEdit objUsuarioEdit = UsuarioEdit.GetUsuarioEdit(intIdUsuario);
                    radTxtUsuario.Text = objUsuarioEdit.Usuario;
                    chkActivo.Checked = objUsuarioEdit.Habilitado;

                    //Persona
                    PersonaEdit objPersonaEdit = PersonaEdit.GetPersonaEdit(objUsuarioEdit.IdPersona);
                    radTxtAPaterno.Text = objPersonaEdit.ApellidoPaterno;
                    radTxtAMaterno.Text = objPersonaEdit.ApellidoMaterno;
                    radTxtNombre.Text = objPersonaEdit.Nombre;
                    radMskTelefono.Text = objPersonaEdit.TelefonoCasa;
                    radMskTelCelular.Text = objPersonaEdit.TelefonoCelular;
                    radTxtEmail.Text = objPersonaEdit.CorreoElectronico;
                    radCmbSexo.SelectedValue = Convert.ToString(objPersonaEdit.ldSexo);
                    radTxtCurp.Text = objPersonaEdit.Curp;
                    chkActivo.Checked = objPersonaEdit.Habilitado;


                    //Administrativo
                    AdministrativoEdit objAdminEdit = AdministrativoEdit.GetAdministrativoEdit(objPersonaEdit.IdPersona);
                    radCmbTitulo.SelectedValue = Convert.ToString(objAdminEdit.IdTitulo);
                    radCmbUnidadResponsable.SelectedValue = Convert.ToString(objAdminEdit.IdUnidadResponsable);
                    //objAdminEdit.IdTipoPersona = 1; //¡¡¡¡¡CAMBIAR
                    objAdminEdit.Habilitado = chkActivo.Checked;


                    return true;
                }
                catch
                {
                    lblError.Text = "Ocurrió un error al consultar los datos del usuario. Inténtelo de nuevo";
                    return false;
                }

            }

            /// <summary>
            /// Elimina los datos del usuario, incluyendo los de persona
            /// </summary>
            /// <param name="intIdUsuario">IdUsuario</param>
            /// <returns></returns>
            protected Boolean EliminarUsuario(long intIdUsuario)
            {
                try
                {

                    UsuarioEdit usuario = UsuarioEdit.GetUsuarioEdit(intIdUsuario);
                    usuario.Delete();
                    PersonaEdit persona = PersonaEdit.GetPersonaEdit(usuario.IdPersona);
                    persona.Delete();
                    AdministrativoEdit administrativo = AdministrativoEdit.GetAdministrativoEdit(persona.IdPersona);
                    administrativo.Delete();


                    UsuarioUpdater.Update(persona, administrativo, usuario);
                    return true;
                }

                catch
                {
                    lblError.Text = "Ocurrió un error al eliminar. Inténtelo de nuevo";
                    return false;
                }
            }

            /// <summary>
            /// Inserta los datos del usuario, asi como los de persona
            /// <returns></returns>
            protected Boolean InsertarUsuario()
            {
                try
                {
                    //Persona
                    PersonaEdit objPersonaEdit = PersonaEdit.NewPersonaEdit();
                    objPersonaEdit.ApellidoPaterno = radTxtAPaterno.Text;
                    objPersonaEdit.ApellidoMaterno = radTxtAMaterno.Text;
                    objPersonaEdit.Nombre = radTxtNombre.Text;
                    objPersonaEdit.TelefonoCasa = radMskTelefono.Text;
                    objPersonaEdit.TelefonoCelular = radMskTelCelular.Text;
                    objPersonaEdit.CorreoElectronico = radTxtEmail.Text;
                    objPersonaEdit.ldSexo = Convert.ToByte(radCmbSexo.SelectedValue);
                    objPersonaEdit.Habilitado = chkActivo.Checked;
                    objPersonaEdit.Curp = radTxtCurp.Text;

                    //Administrativo
                    AdministrativoEdit objAdminEdit = AdministrativoEdit.NewAdministrativoEdit();
                    objAdminEdit.IdTitulo = Convert.ToByte(radCmbTitulo.SelectedValue);
                    objAdminEdit.IdUnidadResponsable = Convert.ToInt64(radCmbUnidadResponsable.SelectedValue);
                    objAdminEdit.IdTipoPersona = 1; //¡¡¡¡¡CAMBIAR
                    objAdminEdit.Habilitado = chkActivo.Checked;
                    //Usuario
                    UsuarioEdit objUsuarioEdit = UsuarioEdit.NewUsuarioEdit();
                    objUsuarioEdit.Usuario = radTxtUsuario.Text;
                    objUsuarioEdit.Password = radTxtPassword.Text;
                    objUsuarioEdit.Habilitado = chkActivo.Checked;


                    UsuarioUpdater.Update(objPersonaEdit, objAdminEdit, objUsuarioEdit);

                    return true;
                }

                catch
                {

                    lblError.Text = "Ocurrió un error al guardar los datos. Inténtelo de nuevo";
                    return false;
                }

            }

            /// <summary>
            /// Actualiza los datos del usuario
            /// </summary>
            /// <param name="intIdUsuario">IdUsuario</param>
            /// <returns></returns>
            protected Boolean ActualizarUsuario(long intIdUsuario)
            {
                try
                {
                    UsuarioEdit objUsuarioEdit = UsuarioEdit.GetUsuarioEdit(intIdUsuario);
                    PersonaEdit objPersonaEdit = PersonaEdit.GetPersonaEdit(objUsuarioEdit.IdPersona);
                    AdministrativoEdit objAdminEdit = AdministrativoEdit.GetAdministrativoEdit(objPersonaEdit.IdPersona);
                    //Persona
                    objPersonaEdit.ApellidoPaterno = radTxtAPaterno.Text;
                    objPersonaEdit.ApellidoMaterno = radTxtAMaterno.Text;
                    objPersonaEdit.Nombre = radTxtNombre.Text;
                    objPersonaEdit.TelefonoCasa = radMskTelefono.Text;
                    objPersonaEdit.TelefonoCelular = radMskTelCelular.Text;
                    objPersonaEdit.CorreoElectronico = radTxtEmail.Text;
                    objPersonaEdit.ldSexo = Convert.ToByte(radCmbSexo.SelectedValue);
                    objPersonaEdit.Habilitado = chkActivo.Checked;
                    objPersonaEdit.Curp = radTxtCurp.Text;
                    //Administrativo
                    objAdminEdit.IdTitulo = Convert.ToByte(radCmbTitulo.SelectedValue);
                    objAdminEdit.IdUnidadResponsable = Convert.ToInt64(radCmbUnidadResponsable.SelectedValue);
                    objAdminEdit.IdTipoPersona = 1; //¡¡¡¡¡CAMBIAR
                    objAdminEdit.Habilitado = chkActivo.Checked;
                    //Usuario
                    objUsuarioEdit.Usuario = radTxtUsuario.Text;
                    objUsuarioEdit.Habilitado = chkActivo.Checked;
                    if (btnCambiarPassword.Text == "Cancelar")
                    {
                        objUsuarioEdit.Password = radTxtPassword.Text;
                    }

                    UsuarioUpdater.Update(objPersonaEdit, objAdminEdit, objUsuarioEdit);

                    return true;
                }
                catch
                {
                    lblError.Text = "Ocurrió un error al actualizar los datos del prestador. Inténtelo de nuevo";
                    return false;
                }

            }

            /// <summary>
            /// Establece el estado para los controles del formulario, para el caso de edición y el de inserción
            /// </summary>
            /// <param name="blnEsEdicion">Es <c>true</c> si se trata de la edición</param>
            private void ControlesEdicion(Boolean blnEsEdicion)
            {
                divDatosUsuario.Visible = blnEsEdicion;
                radBtnBuscar.Visible = !blnEsEdicion;
                radbtnCancelar.Visible = !blnEsEdicion;
                radTxtCurp.Enabled = !blnEsEdicion;
                lblPassword.Visible = !blnEsEdicion;
                radTxtPassword.Visible = !blnEsEdicion;
                lblConfPassword.Visible = !blnEsEdicion;
                radTxtConfPassword.Visible = !blnEsEdicion;
                btnCambiarPassword.Visible = blnEsEdicion;
                rfvConfPassword.Enabled = !blnEsEdicion;
                rfvPassword.Enabled = !blnEsEdicion;
            }
        #endregion

      
    }
}